將java.nio.ByteBuffer a轉換為(新創建的)CharBuffer b或char [] b的最快方法是什麼。 這樣做很重要,a [i] == b [i]。這意味著,不是a [i]和a [i + 1]一起組成一個值b [j],getChar(i)會做什麼,但是這些值應該“擴展”。 byte a [] = {1,2,3,125,126,127,-128,-127,-126} //每個字節(已簽名) char b [] = {1,2,3,125,126,127,128,129,130} //每個為char(未簽名) 請注意,字節:-128具有與char:128相同(低8位)的位。因此,我認為“最佳”解釋將如上所述,因為位是相同的。 之後,我還需要反之亦然的翻譯:將char []或java.nio.CharBuffer返回到java.nio.ByteBuffer的最有效方法。
2021-01-06 08:17:41
因此,您想要的是使用編碼ISO-8859-1進行轉換。 我沒有任何關於效率的主張,但至少寫起來很短: CharBuffer結果= Charset.forName(“ ISO-8859-1”)。decode(byteBuffer); 另一個方向是: ByteBuffer結果= Charset.forName(“ ISO-8859-1”)。encode(charBuffer); 請對照其他解決方案對此進行衡量。 (公平地說,不應包含Charset.forName部分,並且也應僅執行一次,而不是再次對每個緩衝區執行一次。) 從Java 7開始,還有帶有預先實例化的Charset實例的StandardCharsets類,因此您可以使用 CharBuffer結果= StandardCharsets.ISO_8859_1.decode(byteBuffer); 和 ByteBuffer結果= StandardCharsets.ISO_8859_1.encode(charBuffer); 代替。 (這些行與以前的行相同,只是查找更容易,並且沒有錯誤輸入名稱的風險,也無需捕獲不可能的異常。) | 我同意@Ishtar的建議,建議完全避免轉換為新結構,僅在需要時進行轉換。 但是,如果您有堆ByteBuffer,則可以這樣做。 ByteBuffer bb = ... byte [] array = bb.array(); char [] chars = new char [bb.remaining()]; 對於(int i = 0; i